agentmux_srv\backend\reactive/
types.rs

1// Copyright 2025-2026, AgentMux Corp.
2// SPDX-License-Identifier: Apache-2.0
3
4
5use std::sync::Arc;
6
7use serde::{Deserialize, Serialize};
8
9/// Request to inject a message into an agent's terminal.
10#[derive(Debug, Clone, Serialize, Deserialize)]
11pub struct InjectionRequest {
12    pub target_agent: String,
13    pub message: String,
14    #[serde(default, skip_serializing_if = "Option::is_none")]
15    pub source_agent: Option<String>,
16    #[serde(default, skip_serializing_if = "Option::is_none")]
17    pub request_id: Option<String>,
18    #[serde(default, skip_serializing_if = "Option::is_none")]
19    pub priority: Option<String>,
20    #[serde(default)]
21    pub wait_for_idle: bool,
22}
23
24/// Response from a message injection attempt.
25#[derive(Debug, Clone, Serialize, Deserialize)]
26pub struct InjectionResponse {
27    pub success: bool,
28    pub request_id: String,
29    #[serde(default, skip_serializing_if = "Option::is_none")]
30    pub block_id: Option<String>,
31    #[serde(default, skip_serializing_if = "Option::is_none")]
32    pub error: Option<String>,
33    pub timestamp: u64,
34}
35
36/// Agent registration record.
37#[derive(Debug, Clone, Serialize, Deserialize)]
38pub struct AgentRegistration {
39    pub agent_id: String,
40    pub block_id: String,
41    #[serde(default, skip_serializing_if = "Option::is_none")]
42    pub tab_id: Option<String>,
43    pub registered_at: u64,
44    pub last_seen: u64,
45}
46
47/// List of registered agents.
48#[allow(dead_code)]
49#[derive(Debug, Clone, Serialize, Deserialize)]
50pub struct AgentListResponse {
51    pub agents: Vec<AgentRegistration>,
52}
53
54/// Audit log entry for message injection.
55#[derive(Debug, Clone, Serialize, Deserialize)]
56pub struct AuditLogEntry {
57    pub timestamp: u64,
58    #[serde(default, skip_serializing_if = "Option::is_none")]
59    pub source_agent: Option<String>,
60    pub target_agent: String,
61    pub block_id: String,
62    pub message_hash: String,
63    pub message_length: usize,
64    pub success: bool,
65    #[serde(default, skip_serializing_if = "Option::is_none")]
66    pub error_message: Option<String>,
67    pub request_id: String,
68}
69
70/// Poller configuration for AgentMux cloud service.
71#[derive(Debug, Clone, Serialize, Deserialize)]
72pub struct PollerConfig {
73    #[serde(default, skip_serializing_if = "Option::is_none")]
74    pub agentmux_url: Option<String>,
75    #[serde(default, skip_serializing_if = "Option::is_none")]
76    pub agentmux_token: Option<String>,
77    #[serde(default)]
78    pub poll_interval_secs: u64,
79}
80
81/// AgentMux config file format (agentmux.json).
82#[allow(dead_code)]
83#[derive(Debug, Clone, Serialize, Deserialize)]
84pub struct AgentMuxConfigFile {
85    #[serde(default, skip_serializing_if = "Option::is_none")]
86    pub url: Option<String>,
87    #[serde(default, skip_serializing_if = "Option::is_none")]
88    pub token: Option<String>,
89}
90
91/// Pending injection from AgentMux cloud.
92#[allow(dead_code)]
93#[derive(Debug, Clone, Serialize, Deserialize)]
94pub struct PendingInjection {
95    pub id: String,
96    pub message: String,
97    #[serde(default, skip_serializing_if = "Option::is_none")]
98    pub source_agent: Option<String>,
99    #[serde(default, skip_serializing_if = "Option::is_none")]
100    pub priority: Option<String>,
101    #[serde(default)]
102    pub created_at: u64,
103}
104
105/// Response from AgentMux pending endpoint.
106#[allow(dead_code)]
107#[derive(Debug, Clone, Serialize, Deserialize)]
108pub struct PendingResponse {
109    pub injections: Vec<PendingInjection>,
110}
111
112/// Acknowledgment request for delivered injections.
113#[allow(dead_code)]
114#[derive(Debug, Clone, Serialize, Deserialize)]
115pub struct AckRequest {
116    pub injection_ids: Vec<String>,
117}
118
119/// Poller status information.
120#[derive(Debug, Clone, Serialize, Deserialize)]
121pub struct PollerStatus {
122    pub configured: bool,
123    pub running: bool,
124    #[serde(default, skip_serializing_if = "Option::is_none")]
125    pub url: Option<String>,
126    pub has_token: bool,
127    pub poll_count: u64,
128    pub injections_count: u64,
129    #[serde(default, skip_serializing_if = "Option::is_none")]
130    pub last_poll: Option<u64>,
131}
132
133/// Function type for sending input bytes to a block's PTY.
134pub type InputSender = Arc<dyn Fn(&str, &[u8]) -> Result<(), String> + Send + Sync>;